class_name UnitSpawner
extends Node
## 版本：1.0.0
## 功能：在按照优先级排列的 PlayArea 中生成 Unit。
## 使用：挂载到 Node 节点上，配置 play_areas 导出变量。
## 依赖：PlayArea、UnitStats、Unit。

#region Signals
signal on_unit_spawned(unit: Unit)
#endregion

#region Exported parameters
## 所有可以生成单位的网格单元，数组中靠前的游戏区域生成的优先级更高
@export var play_areas: Array[PlayArea]
#endregion

#region Internal parameters
const UNIT = preload("res://scenes/unit/unit.tscn")
#endregion


func spawn_unit(unit_stats: UnitStats) -> void:
	var play_area := _get_first_available_play_area()
	# TODO in the future, throw a popup error message here!
	assert(play_area, "No available play area to add unit to!")
	
	var new_unit := UNIT.instantiate()
	assert(play_area.add_unit_to_first_empty_cell(new_unit), "Error")
	
	new_unit.stats = unit_stats
	on_unit_spawned.emit(new_unit)


func _get_first_available_play_area() -> PlayArea:
	for play_area: PlayArea in play_areas:
		if play_area.unit_grid.has_empty_cell():
			return play_area
	return null
